#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;


//class Solution {
//public:
//    vector<int> findSubstring(string s, vector<string>& words)
//    {
//        vector<int> ret;
//        unordered_map<string, int> hash1;
//        for (auto& s : words)
//        {
//            hash1[s]++;
//        }
//        int len = words[0].size();
//        int m = words.size();
//        int n = s.size();
//        for (int i = 0; i < len; i++)
//        {
//            unordered_map<string, int> hash2;
//            for (int left = i, right = i, count = 0; right + len <= n; right += len)
//            {
//                string in = s.substr(right, len);
//                hash2[in]++;
//                if (hash1.count(in) && hash2[in] <= hash1[in])
//                {
//                    count++;
//                }
//                if (right - left + 1 > len * m)
//                {
//                    string out = s.substr(left, len);
//                    if (hash1.count(out) && hash2[out] <= hash1[out])
//                    {
//                        count--;
//                    }
//                    hash2[out]--;
//                    left += len;
//                }
//                if (count == m)
//                {
//                    ret.push_back(left);
//                }
//            }
//        }
//        return ret;
//    }
//};

//class Solution {
//public:
//    vector<int> findSubstring(string s, vector<string>& words)
//    {
//        vector<int> ret;
//        unordered_map<string, int> m1;
//        for (auto s : words)
//        {
//            m1[s]++;
//        }
//        int l1 = words.size();
//        int l2 = words[0].size();
//        int l3 = s.size();
//        int l4 = l3 - l1 * l2;
//        int left = 0;
//        while (left <= l4)
//        {
//            int k = 0;
//            unordered_map<string, int> m2;
//            int l5 = left + l1 * l2;
//            for (int right = left; right < l5; right += l2)
//            {
//                string in = s.substr(right, l2);
//                m2[in]++;
//                if (m1.count(in) && m2[in] <= m1[in])
//                {
//                    k++;
//                }
//            }
//            if (k == l1)
//            {
//                ret.push_back(left);
//            }
//            left++;
//        }
//        return ret;
//    }
//};
//
//int main()
//{
//    Solution s;
//    string s1 = "wordgoodgoodgoodbestword";
//    vector<string> s2 = { "word","good","best","good" };
//    s.findSubstring(s1, s2);
//    return 0;
//}
//
//class Solution {
//public:
//    string minWindow(string s, string t) {
//        string ret;
//        int n = s.size();
//        int m = t.size();
//        if (n < m)
//        {
//            return ret;
//        }
//        unordered_map<char, int> hash1;
//        unordered_map<char, int> hash2;
//        for (auto p : t)
//        {
//            hash1[p]++;
//        }
//        int left = 0;
//        int right = 0;
//        int len = 0;
//        int my_min = INT_MAX;
//        int zero = 0;
//        int k = left;
//        while (right < n)
//        {
//            len++;
//            hash2[s[right]]++;
//            if (hash2[s[right]] <= hash1[s[right]])
//            {
//                zero++;
//            }
//            while (zero == m)
//            {
//                if (len < my_min)
//                {
//                    my_min = len;
//                    k = left;
//                }
//                if (hash2[s[left]] <= hash1[s[left]])
//                {
//                    zero--;
//                }
//                hash2[s[left]]--;
//                left++;
//                len--;
//            }
//            right++;
//        }
//        if (my_min == INT_MAX)
//        {
//            return ret;
//        }
//        for (int i = 0; i < my_min; i++)
//        {
//            ret += s[i + k];
//        }
//        return ret;
//    }
//};
//
//int main()
//{
//    string s1 = "a";
//    string s2 = "a";
//    Solution s;
//    string s3 = s.minWindow(s1, s2);
//    cout << s3 << endl;
//    return 0;
//}
//
//class Solution {
//public:
//    string minWindow(string s, string t) {
//        int n1 = s.size();
//        int n2 = t.size();
//        string ret;
//        if (n2 > n1)
//        {
//            return ret;
//        }
//        int arr1[100] = { 0 };
//        int arr2[100] = { 0 };
//        for (int i = 0; i < n2; i++)
//        {
//            arr2[t[i] - 'A']++;
//        }
//        int my_min = -1;
//        int len = INT_MAX;
//        int left = 0;
//        int right = 0;
//        int count = 0;
//        while (right < n1)
//        {
//            arr1[s[right] - 'A']++;
//            if (arr1[s[right] - 'A'] <= arr2[s[right] - 'A'])
//            {
//                count++;
//            }
//            while (count == n2)
//            {
//                if (right - left + 1 < len)
//                {
//                    len = right - left + 1;
//                    my_min = left;
//                }
//                arr1[s[left] - 'A']--;
//                if (arr1[s[left] - 'A'] < arr2[s[left] - 'A'])
//                {
//                    count--;
//                }
//                left++;
//            }
//            right++;
//        }
//        if (my_min == -1)
//        {
//            return ret;
//        }
//        for (int i = my_min; i < my_min + len; i++)
//        {
//            ret += s[i];
//        }
//        return ret;
//    }
//};